const redis=require( '../util/redis/redis' );



/* 拦截和放行的请求列表
使用方法
直接把需要校验的地址加进去即可,不用做别的操作
 true就代表要验证，false代表不用验证 
   {
        'path':'/post/api/user/login',
        'run':false,
    },

*/

const items=[

  // token校验
{
    'path':'/get/api/checktoken',
    'run':true,
},

  //#region  用户

  // 用户注册
  {

    'path':'/post/api/user/registry',
    'run':false,
},
  // 编辑用户
  {
    'path':'/post/api/user/updateuser',
    'run':true,
},
  // 删除指定用户,这个是个传入的数组
  {
    'path':'/post/api/user/deleteUsers',
    'run':true,
},
// 用户登录
    {
        'path':'/post/api/user/login',
        'run':false,
    },
    //分页查询用户
    {
      'path':'/post/api/user/queryUsers',
      'run':true,
  },

    //#endregion

    //#region   -------------题目类型
    {
      'path':'/post/tittles/add/type',
      'run':false,
    },
    


    //#endregion


//#region   职业
// 分页查询职业
    {
      'path':'/post/profession/queryProfessions',
      'run':false,
  },

  //#endregion

 //#region 职业类型 
    {
      'path':'/get/professionType/alltype',
      'run':false,
  },
  {
    'path':'/get/api/user/instantRegis',
    'run':false,
  },
  //#endregion

  //#region 行业
  {
    /* 查询所有行业 */
    'path':'/get/industry/queryAllIndustry',
    'run':false,
  },

  //#endregion


//#region   科目
{
  /* 查询指定职业所包含的科目 */
  'path':'/post/kemu/qeuryProfessionIncludeKemu',
  'run':false,
},
{
  /*添加科目 */
  'path':'/post/kemu/add',
  'run':false,
},
{
  /* 查询科目 分页 */
  'path':'/post/kemu/querykemuPages',
  'run':false,
},
//#endregion

  {
    /* 查询指定职能包含得行业 */
    'path':'/get/proFunction/allfunc',
    'run':false,
  },
  {
    /* 查询指定科目所包含的知识点 */
    'path':'/post/kemu/qeuryKemuIncludepoint',
    'run':false,
  },

  {
    /* 查询所有题目类型 */
    'path':'/get/tittles/query/type',
    'run':false,
  },
  {
    /* 即将废弃 */
    'path':'/get/sorts/sortchildfind',
    'run':false,
  },
  {
    /* 即将废弃--查询所有题目类型 */
    'path':'/findallques',
    'run':false,
  },
  ]


/* 
校验列表

获得请求路径，传入方法里，然后再请求列表比对，得到true就代表要验证，false代表不用验证
传入请求地址
*/
function isCheck(url){
  let flag=true
    //遍历拦截列表，获得是否拦截的布尔值
    for(value of items){
      if(url===value.path||url.startsWith(value.path)){
        flag=value.run
      }
  }
  return flag
}



  let interceptor=async (req,res,next) => {
    // console.log(req,65776)
    let uu=isCheck(req.url)

 
   // 如果uu为true，就代表要校验。如果为false，就代表直接放行
    if(uu){
            //需要校验
     
            /* 如果存在token，则从redis里取值，取得出来则token未过期，取不出来则token过期，提示登录或者注册 */
            if('token' in req.headers){
              //如果里面有token，则拿出来到redis里找，获取它的用户身份
              /* 获取请求里的token */
              let token = req.headers.token;
              /* 先再redis里查询token是否存在，如果存在则取出值，然后校验token，再把校验的值和redis取出的值做比较 */
              /* 查询redis里的token是否存在 */
              let isredis= await  new Promise((res,rej) => {
                redis.get(token,(err,value)=>{
                  if(err){
                      return ;
                  }
                  res(value)
              })
              })

              /* 如果该token存在则放行，该token不存在则判断是否 */
              if(isredis){next();}
              else{
                /* redis种没有对应token，提示token过期 */
                res.send({ success: false, code:501,msg: "token过期" })
              }    


      }else{
          /* header里没有token，就返回提示注册身份 */
          res.send({ success: false, code:401,msg: "注册身份" })
      }

    }else{
      //不需要校验，直接放行
      next();
    }
  }


  module.exports=interceptor
